From 1abe8d9d1ec34d80930bb524cd398da7e6746745 Mon Sep 17 00:00:00 2001 From: "kfraser@localhost.localdomain" Date: Fri, 13 Apr 2007 11:20:11 +0100 Subject: [PATCH] hvm svm: Fix nested paging to support domain save/restore. Signed-off-by: Wei Huang --- xen/arch/x86/hvm/svm/svm.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/xen/arch/x86/hvm/svm/svm.c b/xen/arch/x86/hvm/svm/svm.c index cf3f9c647f..5f06d09c08 100644 --- a/xen/arch/x86/hvm/svm/svm.c +++ b/xen/arch/x86/hvm/svm/svm.c @@ -321,9 +321,7 @@ int svm_vmcb_restore(struct vcpu *v, struct hvm_hw_cpu *c) vmcb->rflags = c->rflags; v->arch.hvm_svm.cpu_shadow_cr0 = c->cr0; - vmcb->cr0 = c->cr0 | X86_CR0_WP | X86_CR0_ET; - if ( !paging_mode_hap(v->domain) ) - vmcb->cr0 |= X86_CR0_PG; + vmcb->cr0 = c->cr0 | X86_CR0_WP | X86_CR0_ET | X86_CR0_PG; v->arch.hvm_svm.cpu_cr2 = c->cr2; @@ -424,6 +422,16 @@ int svm_vmcb_restore(struct vcpu *v, struct hvm_hw_cpu *c) vmcb->sysenter_esp = c->sysenter_esp; vmcb->sysenter_eip = c->sysenter_eip; + /* update VMCB for nested paging restore */ + if ( paging_mode_hap(v->domain) ) { + vmcb->cr0 = v->arch.hvm_svm.cpu_shadow_cr0; + vmcb->cr4 = v->arch.hvm_svm.cpu_shadow_cr4; + vmcb->cr3 = c->cr3; + vmcb->np_enable = 1; + vmcb->g_pat = 0x0007040600070406ULL; /* guest PAT */ + vmcb->h_cr3 = pagetable_get_paddr(v->domain->arch.phys_table); + } + vmcb->dr6 = c->dr6; vmcb->dr7 = c->dr7; -- 2.30.2